package model

import (
	"fmt"
	"gin/config"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
)

// db gorm.DB 对象
var DB *gorm.DB
var err error

// SetupDB 初始化数据库和 ORM
func SetupDB() *gorm.DB {
	dns := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		config.DBUser,
		config.DBPassWord,
		config.DBHost,
		config.DBPort,
		config.DBName,
	)
	DB, err = gorm.Open(mysql.Open(dns), &gorm.Config{
		// gorm日志模式：silent
		Logger: logger.Default.LogMode(logger.Silent),
		// 外键约束
		DisableForeignKeyConstraintWhenMigrating: true,
		// 禁用默认事务（提高运行速度）
		SkipDefaultTransaction: true,
		NamingStrategy: schema.NamingStrategy{
			// 使用单数表名，启用该选项，此时，`User` 的表名应该是 `user`
			SingularTable: true,
		},
	})

	if err != nil {
		fmt.Println("数据库连接错误：", err)
	}
	_ = DB.AutoMigrate(&User{})

	// 命令行打印数据库请求的信息
	sqlDB, _ := DB.DB()

	// 设置最大连接数
	sqlDB.SetMaxOpenConns(config.DBMaxOpen)
	// 设置最大空闲连接数
	sqlDB.SetMaxIdleConns(config.DBMaxIdle)
	// 设置每个链接的过期时间
	sqlDB.SetConnMaxLifetime(time.Duration(config.DBMaxLifetime) * time.Second)
	return DB
}
